package com.haima.common.utils;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.ObjectMetadata;
import com.haima.common.config.AliyunOssConfig;
import com.haima.common.utils.file.FileUploadUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;

@Component
public class AliyunOssUploadUtils {
    private static AliyunOssConfig aliyunOssConfig;
    /**
     * 使用构造方法注入配置信息
     */
    @Autowired
    public AliyunOssUploadUtils(AliyunOssConfig aliyunOssConfig) {
        AliyunOssUploadUtils.aliyunOssConfig = aliyunOssConfig;
    }

    /**
     * 上传文件
     * @param file
     * @return
     * @throws Exception
     */
    public static String uploadFile(MultipartFile file) throws Exception {
//        // 生成 OSSClient
//        OSS ossClient = new OSSClientBuilder().build(aliyunOssConfig.getEndpoint(), aliyunOssConfig.getAccessKeyId(), aliyunOssConfig.getAccessKeySecret());
//        // 原始文件名称
//        // String originalFilename = file.getOriginalFilename();
//        // 编码文件名
//        String filePathName = FileUploadUtils.extractFilename(file);
//        // 文件路径名称
//        filePathName = aliyunOssConfig.getFilehost() + "/" + filePathName;
//        try {
//            ossClient.putObject(aliyunOssConfig.getBucketName(), filePathName, file.getInputStream());
//            return aliyunOssConfig.getUrl() + "/" + filePathName;
//        } catch (IOException e) {
//            e.printStackTrace();
//            return null;
//        } finally {
//            if (ossClient != null) {
//                ossClient.shutdown();
//            }
//        }

        // 校验文件是否为空
        if (file.isEmpty()) {
            throw new IllegalArgumentException("上传文件不能为空");
        }

        OSS ossClient = null;

        try (InputStream inputStream = file.getInputStream()) {
            // 获取文件输入流

            // 生成编码后的文件名
            String filePathName = FileUploadUtils.extractFilename(file);
            // 构建完整的文件路径
            String fullFilePath = aliyunOssConfig.getFilehost() + "/" + filePathName;

            // 创建OSS客户端（使用try-with-resources会更好，但需要SDK支持AutoCloseable）
            ossClient = new OSSClientBuilder().build(
                    aliyunOssConfig.getEndpoint(),
                    aliyunOssConfig.getAccessKeyId(),
                    aliyunOssConfig.getAccessKeySecret()
            );

            // 设置文件元信息
            ObjectMetadata metadata = new ObjectMetadata();
            metadata.setContentLength(file.getSize());
            metadata.setContentType(file.getContentType()); // 使用MultipartFile提供的ContentType

            // 上传文件
            ossClient.putObject(aliyunOssConfig.getBucketName(), fullFilePath, inputStream, metadata);

            // 构建并返回文件URL
            return buildFileUrl(fullFilePath);

        } catch (IOException e) {
            // 记录详细错误日志，而不仅仅是打印堆栈
            // log.error("文件上传失败: {}", e.getMessage(), e);
            throw new RuntimeException("文件上传失败: " + e.getMessage(), e);
        } finally {
            // 确保OSS客户端关闭
            if (ossClient != null) {
                try {
                    ossClient.shutdown();
                } catch (Exception e) {
                    // log.warn("关闭OSS客户端时发生错误", e);
                }
            }
        }


    }

    /**
     * 构建文件访问URL
     *
     * @param filePath 文件在OSS中的路径
     * @return 完整的文件URL
     */
    private static String buildFileUrl(String filePath) {
        // 避免URL中出现双重斜杠
        return aliyunOssConfig.getUrl().endsWith("/")
                ? aliyunOssConfig.getUrl() + filePath
                : aliyunOssConfig.getUrl() + "/" + filePath;
    }


    /**
     * 上传文件
     * @param name
     * @return
     * @throws Exception
     */
    public static void deleteFile(String name) {

        name = name.replace(aliyunOssConfig.getUrl()+"/","");

        // 生成 OSSClient
        OSS ossClient = new OSSClientBuilder().build(aliyunOssConfig.getEndpoint(), aliyunOssConfig.getAccessKeyId(), aliyunOssConfig.getAccessKeySecret());
        // 原始文件名称
        try {
            // 删除文件。objectName表示要删除的文件的名称。
            ossClient.deleteObject(aliyunOssConfig.getBucketName(), name);
            System.out.println("File deleted successfully.");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 关闭client。
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }

}
